[feature] 웹/웹뷰 통합 + 웹 바텀 네비게이션 마이그레이션 (MOA-942)#1643
Conversation
앱 네이티브 바텀탭(홈/구독/메뉴)을 웹으로 이식. - RN app/(tabs)/_layout.tsx 스펙 1:1 재현 (배경 #FFFFFF, 아이콘 28px, active #FF5414 / inactive #C5C5C5, height 56+safe-area) - svgr 미사용 환경이라 홈/메뉴 SVG는 CSS mask로 틴팅 (배경 rect 제거) - 구독 아이콘은 PNG 2-state 교체 - Z_INDEX.bottomNav, USER_EVENT.BOTTOM_TAB_CLICKED 추가 - 아직 레이아웃 미마운트 (독립 컴포넌트 + Storybook)
viteFinal plugins에 vite-plugin-svgr 추가. 기존엔 svgr가 없어 ?react SVG import가 컴포넌트가 아닌 URL 문자열로 처리되어 해당 스토리에서 "Invalid element name" 렌더 오류가 발생했다.
프로젝트 컨벤션(vite-plugin-svgr)에 맞춰 홈/메뉴 아이콘을 svg?react 컴포넌트로 import하고 부모 Tab의 color(currentColor)를 상속해 active/inactive 틴팅. 기존 mask 방식 제거.
- 구독 페이지(/subscriptions): 웹뷰=구독 동아리 목록(브릿지), 순수 웹=앱 다운로드 CTA - 메뉴 페이지(/menu): 서비스 소개·총 동아리 연합회·개인정보 처리방침 (RN 더보기 이식) - PAGE_VIEW/PAGE_NAME 상수, /subscriptions·/menu 라우트 추가
- src/layouts/AppLayout: Outlet + BottomNavigation + 하단 여백(safe-area 반영) - /, /introduce, /club-union, /promotions, /subscriptions, /menu 6개를 중첩 라우트 레이아웃으로 묶어 바텀네비 노출 - 상세/홍보상세/지원폼/게임/관리자/콜백/웹뷰는 그룹 밖(미노출) - 헤더는 미변경 (로고+검색 통일은 별도 단계)
- nav 메뉴 링크 3개 + 햄버거/모바일 드롭다운 제거 (메뉴는 바텀네비/메뉴페이지로 이동) - Nav/NavLink/MenuBar/MenuButton 스타일 및 useHeaderNavigation 햄버거 핸들러 제거 - 검색창이 우측에 몰리던 문제 수정: 로고 옆에서 공간 채우도록 (데스크톱 480px 상한)
- webviewRoutes를 /webview/* → 웹 경로 리다이렉트로 전환 (구버전 앱 진입 URL 보호) - WebviewMainPage를 MainPage로 병합 (웹뷰: 카드 구독 버튼·APP_HOME 배너·웹뷰 페이지뷰, Popup/Footer는 웹 전용) - SubscribeButton을 MainPage/components로 이전 - Filter/SearchBox/usePromotionNotification: /webview 문자열 → isInAppWebView() - WebviewGlobalStyles를 App에서 웹뷰 전역 주입, WebviewLayout/webviewFilterConfig 삭제
헤더 간소화로 nav가 빠진 뒤 검색창이 한쪽으로 쏠리던 문제 수정. - 데스크톱·랩탑(>700px): width 345px + margin-left auto로 우측 정렬 - 태블릿·모바일·웹뷰(≤700px): flex:1로 꽉 채움
경로 통합으로 웹뷰가 웹 라우트를 사용하게 되어, IntroducePage·ClubUnionPage의
hideOn={['webview']} 제거 → 웹뷰에서도 로고+검색 헤더가 보이도록.
- PromotionListPage의 웹뷰 SearchBarArea 분기 제거 → 통일 헤더 단일 렌더 - Filter margin-top을 56px로 고정 → 경로 통합으로 웹뷰에 생긴 fixed 헤더를 Filter가 클리어하도록 (MainPage·홍보목록의 헤더 가림 수정) - SearchBarArea/LogoImage/$isWebview 스타일 정리
webviewFilterConfig 삭제·경로 통합을 반영 — isInAppWebView 기반 분기, AppLayout/바텀네비, /webview 리다이렉트 호환 설명으로 교체.
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Warning Review limit reached
More reviews will be available in 57 minutes and 25 seconds. Learn how PR review limits work. Your organization has run out of usage credits. Purchase more in the billing tab. ⌛ How to resolve this issue?After more reviews become available, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available. Please see our Fair Usage Limits Policy for further information. ℹ️ Review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (12)
Warning
|
| Layer / File(s) | Summary |
|---|---|
BottomNavigation 컴포넌트 및 이벤트 기초 frontend/src/components/common/BottomNavigation/BottomNavigation.tsx, BottomNavigation.styles.ts, BottomNavigation.stories.tsx, frontend/src/constants/eventName.ts, frontend/.storybook/main.ts |
하단 탭 네비게이션을 구현하고 홈/구독/메뉴 탭을 정의합니다. 탭 클릭 시 활성 상태를 계산하고 Mixpanel 이벤트를 기록한 후 경로를 이동합니다. Storybook에 3개 스토리(Home, Subscriptions, Menu)를 추가하고 Vite svgr 플러그인을 구성합니다. |
AppLayout 도입과 메인 라우트 중첩 frontend/src/layouts/AppLayout.tsx, AppLayout.styles.ts, frontend/src/routes/AppRoutes.tsx |
AppLayout 컴포넌트를 정의하고 Outlet과 BottomNavigation을 함께 렌더링합니다. 메인 페이지 6개 경로를 element: <AppLayout /> 아래 children 구조로 중첩하여 공통 레이아웃을 적용합니다. |
웹뷰 경로 리다이렉트 및 필터/검색 통합 frontend/src/routes/webviewRoutes.tsx, frontend/src/components/common/Filter/Filter.tsx, Filter.styles.ts, frontend/src/pages/MainPage/components/SearchBox/SearchBox.tsx, frontend/src/hooks/Queries/usePromotionNotification.ts, frontend/src/routes/webviewFilterConfig.ts |
웹뷰 경로(/webview/main, /webview/promotions, /webview/club/*)를 웹 경로로 리다이렉트합니다. Filter, SearchBox, 알림 훅의 webview 경로 분기를 제거하고 isInAppWebView() 기반으로 통합합니다. |
MenuPage 추가 (메뉴/더보기 페이지) frontend/src/pages/MenuPage/MenuPage.tsx, MenuPage.styles.ts, frontend/src/constants/eventName.ts, frontend/docs/features/menu/menu-page.md |
MenuPage 컴포넌트를 구현하고 서비스 소개, 동아리 연합회, 개인정보 처리방침 메뉴 항목을 렌더링합니다. 페이지뷰 추적과 헤더 네비게이션을 연결합니다. |
SubscriptionsPage 추가 (구독 동아리 페이지) frontend/src/pages/SubscriptionsPage/SubscriptionsPage.tsx, SubscriptionsPage.styles.ts, frontend/src/constants/eventName.ts, frontend/docs/features/subscriptions/subscriptions-page.md |
SubscriptionsPage를 구현하고 웹뷰 환경 감지에 따라 구독 동아리 목록 또는 앱 다운로드 CTA를 렌더링합니다. 로딩/에러/빈 상태를 처리합니다. |
MainPage 웹뷰 구독 토글 통합 frontend/src/pages/MainPage/MainPage.tsx, frontend/src/pages/MainPage/components/SubscribeButton/SubscribeButton.tsx, SubscribeButton.styles.ts, frontend/src/App.tsx |
MainPage에서 isInAppWebView() 기반으로 ClubCard에 조건부 SubscribeButton을 렌더링합니다. Banner/Footer를 조건부로 표시하고 웹뷰 전용 전역 스타일을 App.tsx에서 적용합니다. |
Header 메뉴 제거 및 레이아웃 정리 frontend/src/components/common/Header/Header.tsx, Header.styles.ts, frontend/src/hooks/Header/useHeaderNavigation.ts, frontend/src/pages/PromotionPage/PromotionListPage.tsx, PromotionListPage.styles.ts, frontend/src/pages/ClubUnionPage/ClubUnionPage.tsx, frontend/src/pages/IntroducePage/IntroducePage.tsx |
Header에서 모바일 메뉴 렌더링을 제거하고 검색 영역을 정리합니다. PromotionListPage의 webview 전용 UI 분기를 제거하고 클럽 페이지의 헤더 hideOn 속성을 제거합니다. |
지원 변경 frontend/src/styles/Global.styles.ts, frontend/src/styles/zIndex.ts, frontend/docs/claude/features.md, frontend/docs/features/components/bottom-navigation.md |
전역 스타일에 scrollbar-gutter: stable 추가, z-index 상수에 bottomNav: 1000 정의, 라우팅 및 컴포넌트 문서 작성을 완료합니다. |
Estimated code review effort
🎯 4 (Complex) | ⏱️ ~50 minutes
Possibly related PRs
- Moadong/moadong#1552: Filter 컴포넌트의 웹뷰 필터 옵션 및 경로 분기 처리 변경으로 직접 연결됩니다.
- Moadong/moadong#1536: webviewFilterConfig와 webviewRoutes의 통합 리팩토링으로 코드 레벨에서 강하게 연관됩니다.
- Moadong/moadong#908: Z_INDEX 상수화 및 전역 z-index 체계와 동일 파일/목적의 변경입니다.
Suggested reviewers
- suhyun113
- oesnuj
- lepitaaar
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
| Check name | Status | Explanation |
|---|---|---|
| Description Check | ✅ Passed | Check skipped - CodeRabbit’s high-level summary is enabled. |
| Title check | ✅ Passed | PR 제목은 핵심 변경사항인 웹/웹뷰 통합과 웹 바텀 네비게이션 마이그레이션을 명확하게 요약하고 있습니다. |
| Docstring Coverage | ✅ Passed | No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. |
| Linked Issues check | ✅ Passed | Check skipped because no linked issues were found for this pull request. |
| Out of Scope Changes check | ✅ Passed | Check skipped because no linked issues were found for this pull request. |
✏️ Tip: You can configure your own custom pre-merge checks in the settings.
✨ Finishing Touches
🧪 Generate unit tests (beta)
- Create PR with unit tests
- Commit unit tests in branch
feature/#1642-webview-web-migration-MOA-942
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.
Comment @coderabbitai help to get the list of available commands and usage tips.
🎨 UI 변경사항을 확인해주세요
59개 스토리 변경 · 전체 60개 스토리 · 23개 컴포넌트 |
There was a problem hiding this comment.
Code Review
This pull request unifies the web and in-app webview routing by introducing a shared layout with a bottom navigation bar (BottomNavigation), a new MenuPage, and a SubscriptionsPage, while removing redundant webview-specific pages and adding backward-compatible redirects. The review feedback highlights several important improvements, including resolving a UX issue where sub-pages do not correctly keep their parent navigation tabs active, preventing potential runtime crashes by safely handling cases where subscribedClubIds might be undefined, and restricting the maximum width of the bottom navigation bar on desktop screens to maintain a clean layout.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
- isTabActive: /promotions→홈, /introduce·/club-union→메뉴 활성 유지 - 데스크톱에서 바는 풀폭 유지하되 탭 묶음을 max-width 500px 가운데 정렬 (PR #1643 Gemini 리뷰 반영)
데스크톱 클래식 스크롤바 환경에서 페이지별 스크롤바 유무에 따라 뷰포트 폭이 바뀌어 가운데 정렬된 바텀네비가 좌우로 밀리던 문제 수정. html에 scrollbar-gutter: stable 추가로 스크롤바 자리를 항상 예약.
There was a problem hiding this comment.
Actionable comments posted: 4
🧹 Nitpick comments (4)
frontend/src/layouts/AppLayout.styles.ts (1)
4-4: ⚡ Quick win매직 넘버를 상수로 추출하는 것을 고려하세요.
56px가 하드코딩되어 있는데, 이는BottomNavigation의 높이와 일치해야 합니다. 두 컴포넌트 간의 계약을 명확히 하고 향후 높이 변경 시 동기화를 보장하기 위해 공통 상수로 추출하는 것이 좋습니다.예:
src/constants/layout.ts에BOTTOM_NAV_HEIGHT = 56정의 후 양쪽에서 참조🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@frontend/src/layouts/AppLayout.styles.ts` at line 4, The padding-bottom in AppLayout.styles.ts uses a hardcoded "56px" magic number; extract this value into a shared constant (e.g., BOTTOM_NAV_HEIGHT) in a central module (suggested symbol: BOTTOM_NAV_HEIGHT in src/constants/layout.ts) and update both AppLayout.styles.ts and the BottomNavigation component to import and use that constant so the layout contract is explicit and stays synchronized when the nav height changes.frontend/src/components/common/BottomNavigation/BottomNavigation.styles.ts (1)
10-11: ⚡ Quick win하드코딩된 색상을 theme에서 가져오는 것을 권장합니다.
Nav컴포넌트의background-color와border-top색상이 하드코딩되어 있습니다(#ffffff,#f0f0f0).Tab컴포넌트에서는theme.colors를 사용하고 있으므로, 일관성을 위해Nav에서도 theme을 사용하는 것이 좋습니다.♻️ theme 사용 제안
position: fixed; bottom: 0; left: 0; right: 0; - background-color: `#ffffff`; - border-top: 1px solid `#f0f0f0`; + background-color: ${theme.colors.white}; + border-top: 1px solid ${theme.colors.gray[100]}; padding-bottom: env(safe-area-inset-bottom); z-index: ${Z_INDEX.bottomNav};🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@frontend/src/components/common/BottomNavigation/BottomNavigation.styles.ts` around lines 10 - 11, Nav component currently hardcodes background-color (`#ffffff`) and border-top color (`#f0f0f0`); update Nav's styles to use the theme (same approach as Tab) by replacing the hardcoded values with theme references (e.g., theme.colors.background / theme.colors.surface or the appropriate names used in your theme) so the Nav styling is consistent with Tab; locate the Nav style definition in BottomNavigation.styles.ts and swap the literal colors for theme.* tokens and ensure the styled-component receives the theme prop if not already.frontend/src/components/common/BottomNavigation/BottomNavigation.tsx (1)
31-31: ⚡ Quick win탭 key 이름과 label/path의 불일치를 확인하세요.
TABS배열의 두 번째 탭이key: 'explore'로 되어 있지만, 실제label은 '구독'이고path는/subscriptions입니다. 의미상 일관성을 위해 key를'subscriptions'로 변경하는 것이 더 명확할 수 있습니다.💡 제안된 수정
{ - key: 'explore', + key: 'subscriptions', label: '구독', path: '/subscriptions', icon: {🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@frontend/src/components/common/BottomNavigation/BottomNavigation.tsx` at line 31, The TABS entry uses key: 'explore' while its label is '구독' and path is '/subscriptions'—change the tab's key to 'subscriptions' for semantic consistency (update the TABS array entry replacing 'explore' with 'subscriptions' in BottomNavigation's TABS constant) and then search for any usages of the old 'explore' key (e.g., active tab state, switch/case, localStorage keys, tests or analytics) and update them to the new 'subscriptions' key so all references remain consistent.frontend/docs/features/components/bottom-navigation.md (1)
10-10: 💤 Low value마크다운 강조 구문 오인 방지를 위해 파일명 표기를 개선하세요.
Line 10의
subscribe_selected / _unselected.png표기에서 공백과 underscore 조합이 마크다운 강조 구문(_..._)으로 오인될 수 있습니다. 파일명을 백틱으로 감싸거나 슬래시 전후 공백을 제거해주세요.제안하는 수정안
-| 구독 | `/subscriptions` | subscribe_selected / _unselected.png (2-state) | +| 구독 | `/subscriptions` | `subscribe_selected`/`_unselected.png` (2-state) |또는:
-| 구독 | `/subscriptions` | subscribe_selected / _unselected.png (2-state) | +| 구독 | `/subscriptions` | subscribe_selected/_unselected.png (2-state) |🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@frontend/docs/features/components/bottom-navigation.md` at line 10, 테이블 셀에 있는 파일명 표기 "subscribe_selected / _unselected.png"이 마크다운의 강조 구문으로 오인될 수 있으니, 해당 셀(문자열 subscribe_selected / _unselected.png)을 찾아 파일명들을 각각 백틱으로 감싸거나 슬래시 양쪽의 공백을 제거해 `subscribe_selected` / `_unselected.png` 또는 `subscribe_selected/_unselected.png` 형식으로 수정하세요.Source: Linters/SAST tools
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@frontend/docs/features/menu/menu-page.md`:
- Line 31: 현재 문서의 한 문장(31번)에서 “아직 공용 레이아웃에 부착되지 않은 독립 페이지”라고 되어 있는데 실제 동작은
/menu가 AppLayout 하위 라우트로 연결되어 있으므로 문구를 최신화해야 합니다; menu 페이지 설명을 “/menu는
AppLayout의 하위 라우트로 공용 헤더/바텀네비(AppLayout)를 사용합니다” 같은 문장으로 교체하고, 관련 문구가 라우팅(특히
AppLayout과 /menu 연결)을 올바르게 반영하도록 수정하세요.
In `@frontend/docs/features/subscriptions/subscriptions-page.md`:
- Line 18: Update the documentation references to match the current code:
replace the incorrect `WebviewMainPage/components/SubscribeButton` path with the
actual import path `MainPage/components/SubscribeButton` and ensure the listed
components remain `src/pages/MainPage/components/ClubCard/ClubCard.tsx` and
`src/pages/MainPage/components/SubscribeButton/SubscribeButton.tsx`; also update
the page description for `/subscriptions` to state that it is a nested route
under `AppLayout` (not an independent top-level page). Ensure both changed
mentions (the SubscribeButton path and the /subscriptions layout note) are
updated consistently in the subscriptions-page.md text.
In `@frontend/src/pages/SubscriptionsPage/SubscriptionsPage.tsx`:
- Around line 82-84: The onClick handler on Styled.CtaButton uses
window.open(getAppStoreLink(), '_blank') which exposes window.opener and risks
reverse tabnabbing; update the onClick to open the link with protection by
either passing the noopener,noreferrer feature string to window.open (e.g. use
window.open(getAppStoreLink(), '_blank', 'noopener,noreferrer')) or immediately
nulling the opener on the returned window (const w = window.open(...); if (w)
w.opener = null); apply this change in the onClick function tied to
Styled.CtaButton/getAppStoreLink.
- Around line 15-17: The page-view tracking call is placed only inside
SubscribedClubs, causing the non-webview branch to miss the /subscriptions
pageview; move the useTrackPageView(PAGE_VIEW.SUBSCRIPTIONS_PAGE) invocation up
into the SubscriptionsPage component (top-level of the component) so both
branches (webview and non-webview render paths) run the tracker, and remove the
duplicate call from SubscribedClubs to avoid double-tracking.
---
Nitpick comments:
In `@frontend/docs/features/components/bottom-navigation.md`:
- Line 10: 테이블 셀에 있는 파일명 표기 "subscribe_selected / _unselected.png"이 마크다운의 강조
구문으로 오인될 수 있으니, 해당 셀(문자열 subscribe_selected / _unselected.png)을 찾아 파일명들을 각각 백틱으로
감싸거나 슬래시 양쪽의 공백을 제거해 `subscribe_selected` / `_unselected.png` 또는
`subscribe_selected/_unselected.png` 형식으로 수정하세요.
In `@frontend/src/components/common/BottomNavigation/BottomNavigation.styles.ts`:
- Around line 10-11: Nav component currently hardcodes background-color
(`#ffffff`) and border-top color (`#f0f0f0`); update Nav's styles to use the theme
(same approach as Tab) by replacing the hardcoded values with theme references
(e.g., theme.colors.background / theme.colors.surface or the appropriate names
used in your theme) so the Nav styling is consistent with Tab; locate the Nav
style definition in BottomNavigation.styles.ts and swap the literal colors for
theme.* tokens and ensure the styled-component receives the theme prop if not
already.
In `@frontend/src/components/common/BottomNavigation/BottomNavigation.tsx`:
- Line 31: The TABS entry uses key: 'explore' while its label is '구독' and path
is '/subscriptions'—change the tab's key to 'subscriptions' for semantic
consistency (update the TABS array entry replacing 'explore' with
'subscriptions' in BottomNavigation's TABS constant) and then search for any
usages of the old 'explore' key (e.g., active tab state, switch/case,
localStorage keys, tests or analytics) and update them to the new
'subscriptions' key so all references remain consistent.
In `@frontend/src/layouts/AppLayout.styles.ts`:
- Line 4: The padding-bottom in AppLayout.styles.ts uses a hardcoded "56px"
magic number; extract this value into a shared constant (e.g.,
BOTTOM_NAV_HEIGHT) in a central module (suggested symbol: BOTTOM_NAV_HEIGHT in
src/constants/layout.ts) and update both AppLayout.styles.ts and the
BottomNavigation component to import and use that constant so the layout
contract is explicit and stays synchronized when the nav height changes.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: a24b728c-b8e4-4e0f-b4d3-a0e22740f341
⛔ Files ignored due to path filters (8)
frontend/src/assets/images/icons/bottomNav/home.svgis excluded by!**/*.svgfrontend/src/assets/images/icons/bottomNav/menu.svgis excluded by!**/*.svgfrontend/src/assets/images/icons/bottomNav/subscribe_selected.pngis excluded by!**/*.pngfrontend/src/assets/images/icons/bottomNav/subscribe_unselected.pngis excluded by!**/*.pngfrontend/src/assets/images/icons/menu/chevron.svgis excluded by!**/*.svgfrontend/src/assets/images/icons/menu/document.svgis excluded by!**/*.svgfrontend/src/assets/images/icons/menu/info.svgis excluded by!**/*.svgfrontend/src/assets/images/icons/menu/people.svgis excluded by!**/*.svg
📒 Files selected for processing (38)
frontend/.storybook/main.tsfrontend/docs/claude/features.mdfrontend/docs/features/components/bottom-navigation.mdfrontend/docs/features/menu/menu-page.mdfrontend/docs/features/subscriptions/subscriptions-page.mdfrontend/src/App.tsxfrontend/src/components/common/BottomNavigation/BottomNavigation.stories.tsxfrontend/src/components/common/BottomNavigation/BottomNavigation.styles.tsfrontend/src/components/common/BottomNavigation/BottomNavigation.tsxfrontend/src/components/common/Filter/Filter.styles.tsfrontend/src/components/common/Filter/Filter.tsxfrontend/src/components/common/Header/Header.styles.tsfrontend/src/components/common/Header/Header.tsxfrontend/src/constants/eventName.tsfrontend/src/hooks/Header/useHeaderNavigation.tsfrontend/src/hooks/Queries/usePromotionNotification.tsfrontend/src/layouts/AppLayout.styles.tsfrontend/src/layouts/AppLayout.tsxfrontend/src/pages/ClubUnionPage/ClubUnionPage.tsxfrontend/src/pages/IntroducePage/IntroducePage.tsxfrontend/src/pages/MainPage/MainPage.tsxfrontend/src/pages/MainPage/components/SearchBox/SearchBox.tsxfrontend/src/pages/MainPage/components/SubscribeButton/SubscribeButton.styles.tsfrontend/src/pages/MainPage/components/SubscribeButton/SubscribeButton.tsxfrontend/src/pages/MenuPage/MenuPage.styles.tsfrontend/src/pages/MenuPage/MenuPage.tsxfrontend/src/pages/PromotionPage/PromotionListPage.styles.tsfrontend/src/pages/PromotionPage/PromotionListPage.tsxfrontend/src/pages/SubscriptionsPage/SubscriptionsPage.styles.tsfrontend/src/pages/SubscriptionsPage/SubscriptionsPage.tsxfrontend/src/pages/WebviewLayout/WebviewLayout.tsxfrontend/src/pages/WebviewMainPage/WebviewMainPage.styles.tsfrontend/src/pages/WebviewMainPage/WebviewMainPage.tsxfrontend/src/routes/AppRoutes.tsxfrontend/src/routes/webviewFilterConfig.tsfrontend/src/routes/webviewRoutes.tsxfrontend/src/styles/Global.styles.tsfrontend/src/styles/zIndex.ts
💤 Files with no reviewable changes (5)
- frontend/src/pages/WebviewMainPage/WebviewMainPage.styles.ts
- frontend/src/hooks/Header/useHeaderNavigation.ts
- frontend/src/routes/webviewFilterConfig.ts
- frontend/src/pages/WebviewLayout/WebviewLayout.tsx
- frontend/src/pages/WebviewMainPage/WebviewMainPage.tsx
- BottomNavigation: tablet(≤700px) 이하에서만 표시 - AppLayout: 하단 패딩도 tablet 이하에서만 적용 - Header: 데스크톱에서 소개/연합회/홍보 nav links 복원
suhyun113
left a comment
There was a problem hiding this comment.
수고하셨어요!
데탑에서도 보이는 바텀 네비게이션바 잘 제거해주셨네요~
다만 모바일 웹에서 네비게이션바를 통해 다른 탭으로 이동하는 경우 뒤로가기를 했을때 안 이전 탭으로 이동하는 문제가 아직 남아있는 것 같아서 수정해주시면 될 것 같아요!
- 바텀네비 탭 클릭 시 replace 네비게이션으로 history 오염 방지 (suhyun113) - TABS 구독 탭 key 'explore' → 'subscriptions' 의미 일치 수정 - useTrackPageView를 SubscriptionsPage 최상위로 이동 (웹 분기 트래킹 누락 수정) - window.open에 noopener,noreferrer 추가 (reverse tabnabbing 방지) - 문서 3곳 최신화: menu/subscriptions AppLayout 하위 라우트로 수정, SubscribeButton 경로 수정, 마크다운 강조 오인 수정
뒤로 가기 방지 했습니다 ! |
개요
앱의 네이티브 크롬을 제거하고 웹/웹뷰를 하나의 웹으로 통합합니다.
헤더는 로고+검색으로 통일, 네이티브 바텀탭은 웹 바텀 네비게이션으로 대체,
/webview/*경로 의존을isInAppWebView()(UAMoadongApp) 한 갈래로 일원화했습니다.변경 사항 (기능 단위)
웹 바텀 네비게이션
feat(components)웹 바텀 네비게이션 컴포넌트 추가 — RNapp/(tabs)스펙 이식(홈/구독/메뉴) ·49118d7bfix(storybook)svg?reactimport 지원 추가 (스토리 렌더 오류 수정) ·3804dbfbrefactor(components)바텀네비 아이콘 CSS mask →svg?react틴팅 전환 ·e5314c68신규 페이지
feat메뉴(/menu)·구독(/subscriptions) 페이지 추가 ·075f614e레이아웃 셸
feat(layout)AppLayout도입 → 핵심 네비 페이지에 바텀네비 마운트 ·26363a49헤더 통일
refactor(header)헤더를 로고+검색만으로 간소화 (메뉴 링크 → 메뉴 페이지) ·49f1c57afix(header)검색창 반응형 정렬 (데스크톱 우측 / 태블릿 이하 꽉 채움) ·f791af51refactor(header)소개·연합회 페이지 웹뷰에서도 통일 헤더 노출 ·309c4444경로 통합
refactor(webview)웹뷰를 웹 라우트로 통합 —/webview/*리다이렉트화 +MainPage병합(웹뷰 구독 버튼·APP_HOME 배너) ·114cfd17refactor(webview)홍보목록 웹뷰 분기 제거 + Filter 헤더 여백 정렬 ·5fa1a7e2문서
docs(features)웹/웹뷰 통합 라우팅으로 WebView 섹션 갱신 ·2379e165검증
typecheck·lint·build·build-storybook통과useHeaderNavigation테스트 17/17 통과런타임 검증 (RN preview)
이 PR의 Vercel preview URL을 RN 앱
EXPO_PUBLIC_WEBVIEW_URL에 넣어 실기기/시뮬레이터에서 확인:/·/promotions— fixed 헤더 아래 콘텐츠/Filter 안 가림, 바텀네비 3탭/webview/main→/,/webview/club/:id→/clubDetail/:id리다이렉트/clubDetail) · 뒤로가기구버전 앱 호환
src/routes/webviewRoutes.tsx를/webview/* → 웹 경로리다이렉트(상대 경로)로 유지. 구버전 앱 진입 URL 보호용이라 제거 금지.RN 연동 — Moadong/moadong-react-native#21
/webview/main로드 → 본 PR 리다이렉트로/진입 ✓session_id는 FE 부트스트랩(index.tsx)에서 캡처돼 리다이렉트 전에 보존 ✓APP_VERSION브릿지는 미사용으로 잔존(무해)Summary by CodeRabbit
New Features
Improvements
Documentation